Python 解压序列、可迭代对象并赋值给多个变量

Python数据结构和类型

1.1 解压序列赋值给多个变量

现在有一个包含N个元素的元组或者是序列,怎样将它里面的值解压后同时赋值给N个变量?

解决思路:先通过简单的解压赋值给多个变量,前提是变量的数量和序列元素的数量是一致的

下面是简单的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
p = (1,2,3)
x,y,y = p
>>>x ---1
>>>y---2
>>>z---3
**代码实现1**
data = [ 'ABC',20,30.11,(16,28,99) ] # data中的元素有4个
name,share,price,hello = data # 赋值
>>>name
'ABC'
>>>share
20
>>>price
30.11
>>>date
(16,28,39)
**代码实现2**
data = [ 'ABC',20,30.11,(16,28,99) ]
name,share,price,(one,two,three)= data
>>>name
'ABC'
>>>one
16
>>>two
28
>>>three
99

如果变量个数和元素的个数不匹配,就会出现错误

1
2
3
4
5
>>>p = ( 4,5)
x,y,z = p #变量的个数超过元素的个数
ValueError: not enough values to unpack (expected 3, got 2)

这种解压赋值适合任何迭代对象,字符串,。。。。

1
2
3
4
5
6
7
8
9
10
11
12
>>> a,b,c,d,e = p
>>> a
'h'
>>> b
'e'
>>> c
'l'
>>> d
'l'
>>> e
'o'
>>>

如果想要解压一部分,丢弃其他值,只需要通过任意变量进行占位,最后将这些变量丢弃即可

1
2
3
4
5
6
data = [ 'ABC',20,30.11,(16,28,99) ]
_,share,price,_ = date
>>>share
20
>>>price
30.11

在测试中发现,输入丢弃变量的_的时候,显示的值是(16,28,99)

1.2 解压可迭代对象赋值给多个变量

问题

如果一个可迭代对象的元素个数超过变量个数时,会抛出一个 ValueError 。 那么怎样才能从这个可迭代对象中解压出N个元素出来?

解决方案

Python的星号表达式可以用来解决这个问题

http://blog.csdn.net/liuxingen/article/details/50113923

函数参数前面的星号(*)

1
2
3
4
5
6
7
8
9
10
>>> recore = ('hh','abdf@163.com','1223-456-456','456789-123-456')
>>> name, email,*numbers = recore
>>> name
'hh'
>>> email
'abdf@163.com'
>>> numbers # 通过星号存储了同一类的
['1223-456-456', '456789-123-456']
>>> print(type(numbers)) # 自动转化成了list
<class 'list'>

值得注意的是上面解压出的numbers 变量永远都是列表类型,不管解压的电话号码数量是多少(包括0个)。 所以,任何使用到 numbers 变量的代码就不需要做多余的类型检查去确认它是否是列表类型了。

1.3 字典也是可以解压的

对于字典类型的解压,解压出来的是字典的key,例如:

1
2
3
4
5
a,b ={“name”:"hh","age":123}
>>>a
name
>>>b
age

© 2018 Peter's Blog Center All Rights Reserved.
Theme by hiero